package com.cookie.utils;

import com.cookie.config.RedisConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 统一调用该工具类来执行redis相关操作
 * 由该工具类判断是单机还是集群，
 * 并使用jedis pool连接池来连接单机模式的redis,使用jedis cluster来连接redis集群
 */
public class RedisUtil {
    private boolean cluster_flag;
    // 是否将field名转化为小写
    private boolean useLowerCase = false;
    // 前缀
    private String prefix;

    private RedisSingleUtil single;
    // 用于连接redis集群
    private RedisClusterUtil cluster;

    public RedisUtil(RedisConfig redisConf){
        cluster_flag = redisConf.isCluster();
        useLowerCase = redisConf.isUseLowerCase();
        // TODO 测试一下前缀功能
        if(redisConf.getPrefix()!=null){
            prefix = redisConf.getPrefix()+":";
        }

        // 根据配置判断redis是单机还是集群，其实可以写一个工具类
        if(!cluster_flag){
            String addrs = redisConf.getAddrs();
            String[] addr = addrs.split(":");
            redisConf.setIp(addr[0].trim());
            redisConf.setPort(Integer.parseInt(addr[1].trim()));
            // 创建redis工具类实例
            single = new RedisSingleUtil(redisConf);
            // 在这个阶段密码错误不会报错？只有在从连接池中取连接时才报错？
            // JedisConnectionException: Could not get a resource from the pool
            // JedisDataException: ERR invalid password
            System.out.println("单机模式下redis连接成功");
        }else {
            // 创建用于连接redis集群的工具类
            cluster = new RedisClusterUtil(redisConf);
            System.out.println("集群模式下redis连接成功");
        }
    }
    /**
     * 释放资源
     *
     */
    protected void closeResource() {
        if(!cluster_flag){
            // 单机模式的连接使用连接池维护，每次执行操作时都会从连接池中取出和归还连接
            // 不需要在最后释放资源
            // single.closeResource();
        }else{
            cluster.closeResource();
        }

    }
    /**
     *  删除key
     */
    public void delKey(String key) {
        // 前缀功能
        if(prefix!=null){
            key = prefix + key;
        }
        if(!cluster_flag){
            single.delKey(key);
        }else {
            cluster.delKey(key);
        }
    }

    /**
     *  添加string数据
     *
     */
    public String stringSet(String key, String value) {
        // 前缀功能
        if(prefix!=null){
            key = prefix + key;
        }
        String lastVal = null;
        if(!cluster_flag){
            lastVal = single.stringSet(key,value);
        }else {
            // 添加了集群模式的string set, 该方法没有返回值
            cluster.stringSet(key,value);
        }
        return lastVal;
    }
    /**
     *  添加hash数据
     *
     */
    public void hashSet(String key, String field, String value) {
        // 前缀功能
        if(prefix!=null){
            key = prefix + key;
        }
        // 将field转换为小写
        if(useLowerCase){
            field = field.toLowerCase();
        }
        if(!cluster_flag){
            single.hashSet(key,field,value);
        }else {
            cluster.hashSet(key,field,value);
        }
    }
}
